/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package familytree.struts.actions;

import Correo.CorreoSaliente;
import familytree.negocio.INodoProcessor;
import familytree.negocio.IUsuarioProcessor;
import familytree.negocio.bo.NodoBO;
import familytree.negocio.bo.UsuarioBO;
import familytree.persistencia.pojos.Nodo;
import familytree.persistencia.pojos.Usuario;
import familytree.struts.forms.CorreoForm;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

/**
 *
 * @author Jose
 */
public class ArbolAction extends org.apache.struts.action.Action {
    
    /* forward name="success" path="" */
    private final static String OK = "ok";
    
    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        //Capturamos el parametro que indica el boton seleccionado
        String seleccion = request.getParameter("accionSeleccionada");
        
        //Si es editar, se edita
        if (seleccion.toLowerCase().equals("editar"))
        {
            return mapping.findForward("editar");
        }
        //Se añade la pareja
        else if (seleccion.equals("anadirPareja"))
        {
            return mapping.findForward("anadirPareja");
        }
        //Si es pareja se trata de añadir hijo a la pareja que indique la cadena
        else if (seleccion.contains("Pareja"))
        {
            //Capturamos el id  de la pareja y vamos a la siguiente pagina
            String id = capturaId(seleccion);
            request.setAttribute("idPareja", id);
            return mapping.findForward("anadirHijo");
        }
        
        //Si se pulsa sobre algun miembro de la familia
        else if (seleccion.contains("enlace"))
        {
            //Capturamos su id incluido 
            String id = capturaId(seleccion);
            INodoProcessor nodoBd = new NodoBO();
            //Capturamos el nodo completo para el id seleccionado
            Nodo nodoActual = nodoBd.getNodoPorIdNodo(id);
            //Hacemos de ese nodo el nodo actual
            request.getSession().setAttribute("nodoActual", nodoActual);
            return mapping.findForward("vuelve");
        }
        //si la opción fue añadir padre
        else if(seleccion.equals("anadirPadre"))
        {
            return mapping.findForward("anadirPadre");
        }
        //si la opción fue añadir madre
        else if (seleccion.equals("anadirMadre")){
        
            return mapping.findForward("anadirMadre");
        }
        else if(seleccion.toLowerCase().equals("correo")){
            Nodo nodoActual = (Nodo)request.getSession().getAttribute("nodoActual");
            String idNodo = String.valueOf(nodoActual.getIdNodo());
            CorreoForm cf = (CorreoForm)form;
            String correoElectronico = cf.getCorreoElectronico();
            if (!esCorrecto(correoElectronico))
            {
                request.setAttribute("falloCorreo", true);
                return mapping.findForward("falloCorreo");
            }
            
            else if (existeCorreo(correoElectronico))
            {
                request.setAttribute("existeCorreo", true);
                return mapping.findForward("falloCorreo");
            }
            
            else
            {                
                String E = servlet.getServletContext().getInitParameter("clavePublicaE");
                String D = servlet.getServletContext().getInitParameter("clavePrivadaD");
                String N = servlet.getServletContext().getInitParameter("claveN");
                CorreoSaliente.sendMail(correoElectronico, idNodo, E, D, N);
                return mapping.findForward("vuelve");
            }
        }              
        return mapping.findForward(OK);
        
    }
    
     private String capturaId(String seleccion) {
        
        String id;
        
        String idS = seleccion.substring(6);
        id = idS;
        
        return id;
    }

    private boolean esCorrecto(String correoElectronico) {
        
        if (correoElectronico == null)
            return false;
        Pattern expresion = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
        Matcher matcher = expresion.matcher(correoElectronico);
        if (!matcher.matches())
            return false;
        return true;
            
    }

    private boolean existeCorreo(String correoElectronico) {
        
        IUsuarioProcessor usuarioBD = new UsuarioBO();
        return usuarioBD.existeUsuarioConCorreo(correoElectronico);
    }
}